part of leancloud_rest_api;

/// Decoding
class _LCDecoder {
  static dynamic decode(dynamic data) {
    if (data is Map) {
      // add by me
      data.forEach((key, value) {
        if (key == 'createdAt' || key == 'updatedAt') {
          data[key] = decodeDate(value);
        }
      });

      if (data.containsKey('__type')) {
        // 支持的内置类型
        var type = data['__type'];
        assert(type is String);
        if (type == 'Date') {
          return decodeDate(data['iso']);
        } else if (type == 'Bytes') {
          // Base64 解码
          return base64Decode(data['base64']);
        }
        // else if (type == 'Object') {
        //   return decodeNestedObject(data);
        // } else if (type == 'Pointer') {
        //   // 引用对象
        //   return decodeNestedObject(data);
        // } else if (type == 'Relation') {
        //   return decodeRelation(data);
        // } else if (type == 'GeoPoint') {
        //   return decodePoint(data);
        // } else if (type == 'File') {
        //   return decodeFile(data);
        // }
      }
      // 普通的 Map 类型
      return data.map((key, value) {
        return MapEntry(key, decode(value));
      });
    } else if (data is List) {
      return data.map((item) => decode(item)).toList();
    }
    return data;
  }

  // LCRelation decodeRelation(dynamic data) {
  //   LCRelation relation = new LCRelation();
  //   relation.targetClass = data['className'];
  //   return relation;
  // }

  // LCObject decodeNestedObject(dynamic data) {
  //   String className = data['className'];
  //   LCObject object = LCObject(className, null)._createByName(className);
  //   _LCObjectData objectData = _LCObjectData().decode(data);
  //   object._merge(objectData);
  //   return object;
  // }

  // LCGeoPoint decodePoint(dynamic data) {
  //   double latitude = data['latitude'];
  //   double longitude = data['longitude'];
  //   return new LCGeoPoint(latitude, longitude);
  // }

  static DateTime decodeDate(dynamic data) {
    return DateTime.parse(data).toLocal();
  }

  // LCFile decodeFile(dynamic data) {
  //   LCFile file = new LCFile();
  //   _LCObjectData objectData = _LCObjectData().decode(data);
  //   file._merge(objectData);
  //   return file;
  // }

  // LCACL decodeACL(Map data) {
  //   LCACL acl = new LCACL();
  //   data.forEach((key, value) {
  //     Map access = value;
  //     if (access.containsKey('read')) {
  //       acl.readAccess[key] = access['read'];
  //     }
  //     if (access.containsKey('write')) {
  //       acl.writeAccess[key] = access['write'];
  //     }
  //   });
  //   return acl;
  // }
}
